package cn.wzc.crystal.platform.query.impl;

import cn.wzc.crystal.platform.query.QueryCompiler;
import cn.wzc.crystal.platform.query.QuerySql;
import lombok.Setter;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Setter
public class DefaultQueryCompiler implements QueryCompiler {

	private boolean retainNewline = false;

	// TODO 缺乏缓存机制
	@Override
	public QuerySql compile(String name, String sqlTemplate, Map<String, Object> context) {
		// 将sql切分成行，将行切分成块，每一行分析是否是可编译行，每一块分析是否是站位块。
		// 然后根据sql命名缓存行和块，编译的时候拿出行如果是编译行调用编译方法，编译的时候找到每一块，如果是站位块则替换成"？"或者"(?,?,?)"
		// 最后实现一次遍历输入到StringBuilder中即可。
		// 最终在编译期间不需要正则表达式或者文本分析

		// 预编译阶段
		final String[] sqlLines = sqlTemplate.split("\n");
		final List<PrepareSqlLine> lines = new ArrayList<>();
		for (String line : sqlLines) {
			lines.add(new PrepareSqlLine(line.trim()));
		}

		final StringBuilder stringBuilder = new StringBuilder();
		final List<Object> args = new ArrayList<>();

		// 遍历行,进行处理
		for (PrepareSqlLine line : lines) {
			QuerySql querySql = line.compile(context);
			if (null == querySql) {
				continue;
			}
			stringBuilder.append(querySql.getSql());
			Collections.addAll(args, querySql.getArgs());
			if (retainNewline) {
				stringBuilder.append("\n");
			} else {
				stringBuilder.append(" ");
			}
		}

		String sql = stringBuilder.toString();
		sql = sql.replaceAll("where\\s+and", " where");
		sql = sql.replaceAll("where\\s+group\\s+by", "group by ");
		sql = sql.replaceAll("where\\s+order\\s+by", "order by ");

		return new QuerySql(sql, args.toArray());
	}


}
